package it.dk.view;

import org.newdawn.slick.Music;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.Sound;

/**
 * Classe che si occupa della gestione del sonoro nel gioco
 * (musiche e suoni)
 * 
 * Pattern utilizzato: Singleton
 */
public class GameSound {

	private static Music soundtrack, demoSoundtrack,levelStart,win,death;
	private static Sound walk, jump, jumpOverObstacle;
	private static GameSound instance = null;
	private static boolean audioEnabled;

	/**
	 * Costruttore privato vuoto della classe (richiesto dal pattern singleton)
	 */
	private GameSound(){
		try {
			soundtrack = new Music("res/sound/soundtrack.wav");
			demoSoundtrack = new Music("res/sound/demo_soundtrack.wav");
			levelStart = new Music("res/sound/level_start.wav");
			win = new Music("res/sound/win.wav");
			death = new Music("res/sound/death.wav");
			walk = new Sound("res/sound/walk.wav");
			jump = new Sound("res/sound/jump.wav");
			jumpOverObstacle = new Sound("res/sound/jump_over_obstacle.wav");
		} catch (SlickException e) {
			System.err.println("ERRORE CARICAMENTO FILE AUDIO.");
			e.printStackTrace();
		}
	}

	/**
	 * Metodo utilizzato per restituire l'unica istanza della classe
	 * (richiesto per l'implementazione del pattern singleton)
	 * 
	 * @return	l'unica istanza della classe
	 */
	public static GameSound getInstance(){
		if(instance==null){
			instance = new GameSound();
			init();
		}
		return instance;
	}
	
	/**
	 * Metodo di inizializzazione dell'unica istanza di GameSound
	 */
	public static void init(){
		audioEnabled = true;
	}
	
	/**
	 * Metodo per iniziare la riproduzione della colonna sonora
	 */
	public void playSoundtrack(){
		if(!soundtrack.playing() && audioEnabled){
			soundtrack.setVolume(0.5f);
			soundtrack.loop();
		}
	}
	
	/**
	 * Metodo per fermare la riproduzione della colonna sonora
	 */
	public void stopSoundtrack(){
		if(soundtrack.playing() && audioEnabled){
			soundtrack.stop();
		}
	}

	/**
	 * Metodo per iniziare la riproduzione della colonna sonora
	 * della demo
	 */
	public void playDemoSoundtrack(){
		if(!demoSoundtrack.playing() && audioEnabled){
			demoSoundtrack.setVolume(0.5f);
			demoSoundtrack.loop();
		}
	}

	/**
	 * Meodo per inizare la riproduzione del suono dei passi dell'eroe
	 */
	public void playWalk(){
		if(!walk.playing() && audioEnabled){
			walk.play();
		}
	}

	/**
	 * Metodo per riprodurre il suono di sconfitta
	 */
	public void playDeath(){
		if(!death.playing() && audioEnabled){
			death.play();
		}
	}
	
	/**
	 * Metodo per riprodurre il suono del salto dell'eroe
	 */
	public void playJump(){
		if(audioEnabled){
			jump.stop();
			jump.play();
		}
	}
	
	/**
	 * Metodo per riprodurre il suono del salto sopra un barile
	 */
	public void playJumpOverObstacle(){
		if(audioEnabled){
			jumpOverObstacle.play();
		}
	}
	
	/**
	 * Metodo per riprodurre il suono di inizio livello
	 */
	public void playLevelStart(){
		if(!levelStart.playing() && audioEnabled){
			levelStart.play();
		}
	}
	
	/**
	 * Metodo per riprodurre il suono di vittoria
	 */
	public void playVictory(){
		if(!win.playing() && audioEnabled){
			win.play();
		}
	}
	
	/**
	 * Metodo per disabilitare i suoni
	 */
	public void mute(){
		audioEnabled = false;
	}
	
	/**
	 * Metodo per fermare la riproduzione del suono dei passi dell'eroe
	 */
	public void stopWalk(){
		walk.stop();
	}
	
	/**
	 * Metodo per abilitare i suoni
	 */
	public void enableAudio(){
		audioEnabled = true;
	}
}
